//package cn.edu.zisu.common.util;
//
//import cn.edu.zisu.common.model.info.ResultInfo;
//import cn.edu.zisu.common.model.request.ListPagingParam;
//import cn.edu.zisu.common.model.request.PagingParam;
//import cn.edu.zisu.common.model.request.RequestParameter;
//import cn.edu.zisu.common.model.response.ListPagingPagerData;
//import cn.edu.zisu.common.model.response.ListPagingResponse;
//import com.google.common.collect.Lists;
//import lombok.Data;
//
//import java.lang.reflect.Method;
//import java.util.Collections;
//import java.util.List;
//import java.util.concurrent.ExecutorService;
//
///**
// * @author chuansongcao
// */
//@Data
//public class PagingUtils {
//
//    public static ResultInfo<String> checkPagingParam(PagingParam param) {
//        if (param == null) {
//            return ResultInfo.error("不合法的分页参数");
//        }
//        if (param.getLength() > PagingParam.MAX_PAGING.getLength()) {
//            return ResultInfo.error("最大分页size = " + PagingParam.MAX_PAGING.getLength());
//        }
//        return ResultInfo.success();
//    }
//
//    public static <T> List<T> paging(List<T> data, int start, int length) {
//        List<T> result = Collections.emptyList();
//        if (start < 0) {
//            throw new RuntimeException("不合法的分页参数");
//        } else {
//            if (start < data.size()) {
//                result = data.subList(start, Math.min((start + length), data.size()));
//            }
//        }
//        return result;
//    }
//
//    /**
//     * @param bean             spring bean
//     * @param listPagingParam  分页参数
//     * @param methodName       方法名
//     * @param queryCurrentPage 是否只查询当前页
//     * @param executorService  线程池，如果不传，则顺序执行
//     * @param <V>              DTO类型
//     * @param <B>              bean类型
//     * @param <P>              参数类型
//     * @return 查询结果
//     * @throws Exception 异常信息
//     */
//    @SuppressWarnings("unchecked")
//    public static <V, B, P extends ListPagingParam> ListPagingPagerData<V> pagingQuery(B bean, P listPagingParam, String methodName, boolean queryCurrentPage, ExecutorService executorService) throws Exception {
//        if (listPagingParam == null || bean == null || methodName == null) {
//            return ListPagingPagerData.EMPTY;
//        }
//        if (queryCurrentPage && listPagingParam.getPagingParam() == null) {
//            return ListPagingPagerData.EMPTY;
//        }
//        listPagingParam.setPagingParam(new PagingParam(queryCurrentPage ? listPagingParam.getPagingParam().getStart() : PagingParam.MAX_PAGING.getStart(),
//                queryCurrentPage ? listPagingParam.getPagingParam().getLength() : PagingParam.MAX_PAGING.getLength()));
//        Method method = bean.getClass().getMethod(methodName, RequestParameter.class);
//        ListPagingResponse<V> response = queryResponse(method, bean, listPagingParam);
//        Integer total = response.getResponseRecordsTotal();
//        if (total == null || total == 0) {
//            return new ListPagingPagerData<>(0, Collections.emptyList());
//        }
//        List<V> result = Lists.newArrayListWithCapacity(total);
//        result.addAll(response.getResponseData() == null ? Collections.emptyList() : response.getResponseData());
//        if (queryCurrentPage) {
//            return new ListPagingPagerData<>(total, result);
//        }
//        PagingParam pagingParam = listPagingParam.getPagingParam();
//        int times = total / pagingParam.getLength() + (total % pagingParam.getLength() > 0 ? 1 : 0);
//        if (times > 1) {
//            CountDownGroupQueryService<V, B, P> countDownGroupQueryService = new CountDownGroupQueryService<>(executorService);
//            for (int start = 1; start < times; start++) {
//                P cloneListPagingParam = (P) BeanUtils.cloneBean(listPagingParam);
//                cloneListPagingParam.setPagingParam(new PagingParam(start * pagingParam.getLength(), pagingParam.getLength()));
//                countDownGroupQueryService.addJob(new QueryJob<>(method, bean, cloneListPagingParam));
//            }
//            result.addAll(countDownGroupQueryService.run());
//        }
//        return new ListPagingPagerData<>(total, result);
//    }
//
//    @SuppressWarnings("unchecked")
//    public static <V, B, P extends ListPagingParam> ListPagingResponse<V> queryResponse(Method method, B bean, P listPagingParam) throws Exception {
//        ListPagingResponse<V> res = (ListPagingResponse<V>) method.invoke(bean, new RequestParameter<>(listPagingParam));
//        if (res == null) {
//            throw new QueryException(String.format("查询出错, bean: %s, method: %s", bean.getClass().getName(), method.getName()));
//        }
//        if (!res.isResponseRight()) {
//            throw new QueryException(String.format("查询出错, 原因: %s", res.getMessage()));
//        }
//        return res;
//    }
//}
//
